# Python3 字符串
# 字符串是 Python 中最常用的数据类型。我们可以使用引号( ' 或 " )来创建字符串。
# 创建字符串很简单，只要为变量分配一个值即可。例如：

var1 = 'Hello World!'
var2 = "Runoob"

# Python 访问字符串中的值
# Python 不支持单字符类型，单字符在 Python 中也是作为一个字符串使用。
# Python 访问子字符串，可以使用方括号 [] 来截取字符串，字符串的截取的语法格式如下：

var1 = 'Hello World!'
var2 = "Runoob"

print("var1[0]: ", var1[0])
print("var2[1:5]: ", var2[1:5])

# Python 字符串更新
# 你可以截取字符串的一部分并与其他字段拼接，如下实例：
var1 = 'Hello World!'
print("已更新字符串 : ", var1[:6] + 'Runoob!')

import time
# 回车，将 \r 后面的内容移到字符串开头，并逐一替换开头部分的字符，直至将 \r 后面的内容完全替换完成。

for i in range(101):
    print("\r{:3}%".format(i),end=' ')
    time.sleep(0.01)

# \r 是回车符（Carriage Return），它会将光标移到当前行的开头，这样新的输出就会覆盖掉之前的输出，实现动态刷新显示。
# {:3}% 是格式化字符串，其中 {:3} 表示以至少 3 个字符宽度输出 i，如果 i 的位数不足 3 个字符，会自动填充空格。
# .format(i) 会将 i 的值插入到 {} 位置，显示为进度百分比。
# end=' ' 指定 print 不换行，而是保持在同一行输出。
# 这里调用 time.sleep(0.05)，程序会在每次循环后暂停 0.05 秒，模拟进度条的缓慢推进。


print('\'Hello, world!\'')  # 输出：'Hello, world!'

print("Hello, world!\nHow are you?")  # 输出：Hello, world!
                                        #       How are you?

print("Hello, world!\tHow are you?")  # 输出：Hello, world!    How are you?

print("Hello,\b world!")  # 输出：Hello world!

print("Hello,\f world!")  # 输出：
                           # Hello,
                           #  world!

print("A 对应的 ASCII 值为：", ord('A'))  # 输出：A 对应的 ASCII 值为： 65

print("\x41 为 A 的 ASCII 代码")  # 输出：A 为 A 的 ASCII 代码

decimal_number = 42
binary_number = bin(decimal_number)  # 十进制转换为二进制
print('转换为二进制:', binary_number)  # 转换为二进制: 0b101010

octal_number = oct(decimal_number)  # 十进制转换为八进制
print('转换为八进制:', octal_number)  # 转换为八进制: 0o52

hexadecimal_number = hex(decimal_number)  # 十进制转换为十六进制
print('转换为十六进制:', hexadecimal_number) # 转换为十六进制: 0x2a


# Python 字符串运算符
# 下表实例变量 a 值为字符串 "Hello"，b 变量值为 "Python"：


# 操作符	描述	实例
# +	字符串连接	a + b 输出结果： HelloPython
# *	重复输出字符串	a*2 输出结果：HelloHello
# []	通过索引获取字符串中字符	a[1] 输出结果 e
# [ : ]	截取字符串中的一部分，遵循左闭右开原则，str[0:2] 是不包含第 3 个字符的。	a[1:4] 输出结果 ell
# in	成员运算符 - 如果字符串中包含给定的字符返回 True	'H' in a 输出结果 True
# not in	成员运算符 - 如果字符串中不包含给定的字符返回 True	'M' not in a 输出结果 True
# r/R	原始字符串 - 原始字符串：所有的字符串都是直接按照字面的意思来使用，没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r（可以大小写）以外，与普通字符串有着几乎完全相同的语法。
# print( r'\n' )
# print( R'\n' )
# %	格式字符串	请看下一节内容。

a = "Hello"
b = "Python"

print("a + b 输出结果：", a + b)
print("a * 2 输出结果：", a * 2)
print("a[1] 输出结果：", a[1])
print("a[1:4] 输出结果：", a[1:4])

if ("H" in a):
    print("H 在变量 a 中")
else:
    print("H 不在变量 a 中")

if ("M" not in a):
    print("M 不在变量 a 中")
else:
    print("M 在变量 a 中")

print(r'\n')
print(R'\n')

# Python 字符串格式化
# Python 支持格式化字符串的输出 。尽管这样可能会用到非常复杂的表达式，但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中。
# 在 Python 中，字符串格式化使用与 C 中 sprintf 函数一样的语法。

print ("我叫 %s 今年 %d 岁!" % ('小明', 10))

# 符号描述
# %c
# 格式化字符及其ASCII码
# %s
# 格式化字符串
# %d
# 格式化整数
# %u
# 格式化无符号整型
# %o
# 格式化无符号八进制数
# %x
# 格式化无符号十六进制数
# %X
# 格式化无符号十六进制数（大写）
# %f
# 格式化浮点数字，可指定小数点后的精度
# %e
# 用科学计数法格式化浮点数
# %E
# 作用同 % e，用科学计数法格式化浮点数
# %g
# % f和 % e的简写
# %G
# %f和 % E的简写
# %p
# 用十六进制数格式化变量的地址

# Python三引号
# python三引号允许一个字符串跨多行，字符串中可以包含换行符、制表符以及其他特殊字符。实例如下
para_str = """这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
"""
print (para_str)

errHTML = '''
<HTML><HEAD><TITLE>
Friends CGI Demo</TITLE></HEAD>
<BODY><H3>ERROR</H3>
<B>%s</B><P>
<FORM><INPUT TYPE=button VALUE=Back
ONCLICK="window.history.back()"></FORM>
</BODY></HTML>
'''

# f-string
# f-string 是 python3.6 之后版本添加的，称之为字面量格式化字符串，是新的格式化字符串的语法。
# 之前我们习惯用百分号 (%):

# f-string 格式化字符串以 f 开头，后面跟着字符串，字符串中的表达式用大括号 {} 包起来，它会将变量或表达式计算后的值替换进去，实例如下：
